package com.yonxao.demo.crud.core;

import cn.hutool.core.lang.Assert;

import static com.yonxao.demo.crud.core.RetCodeEnum.*;


/**
 * 返回结果构造帮助类
 *
 * @author 刘锐
 * @date 2020-11-12 14:40
 **/
@SuppressWarnings("rawtypes,unchecked,unused")
public class RetUtil {
    /**
     * 成功，使用200表示成功
     *
     * @return 成功的数据返回结果
     */
    public static Ret success() {
        return new Ret(SUCCESS);
    }

    /**
     * 成功
     *
     * @param data 数据
     * @param <T>  数据类型
     * @return 成功的数据返回结果
     */
    public static <T> Ret<T> success(T data) {
        return new Ret<>(SUCCESS.getCode(), SUCCESS.getMsg(), data);
    }

    /**
     * 服务器端异常
     *
     * @return 服务器端异常的数据返回结果
     */
    public static Ret serverError() {
        return new Ret(SERVER_ERROR);
    }

    /**
     * 服务器端异常
     *
     * @param msg 消息
     * @return 服务器端异常的数据返回结果
     */
    public static Ret serverError(String msg) {
        return error(SERVER_ERROR.getCode(), msg);
    }

    /**
     * 错误
     *
     * @param code 状态码结构
     * @return 失败的数据返回结果
     */
    public static Ret error(RetCode code) {
        if (code == null) {
            throw new IllegalStateException("code");
        }
        return error(code.getCode(), code.getMsg());
    }

    /**
     * 错误
     *
     * @param code 状态码
     * @param msg  消息
     * @return 失败的数据返回结果
     */
    public static Ret error(int code, String msg) {
        if (SUCCESS.getCode() == code) {
            throw new IllegalArgumentException("错误码不能与成功码相同");
        }
        return new Ret(code, msg, null);
    }

    /**
     * 错误
     *
     * @param ret 返回数据
     * @return 失败的数据返回结果
     */
    public static Ret error(Ret ret) {
        if (ret == null) {
            throw new IllegalArgumentException();
        }
        return error(ret.getCode(), ret.getMsg());
    }

    /**
     * 无效的参数
     *
     * @param paramName 参数名
     * @return 错误
     */
    public static Ret invalidParam(String paramName) {
        Assert.notEmpty(paramName);
        return error(INVALID_PARAM.getCode(), INVALID_PARAM.getMsg() + paramName);
    }

    /**
     * 调用api接口异常
     *
     * @return api接口异常的数据返回结果
     */
    public static Ret apiError() {
        return new Ret(API_ERROR);
    }
}
